"""
!/usr/bin/env python
-*- coding: utf-8 -*-
@Author  : MarkJia
@Site    : 
@File    : 30、第三方库pymysql.py
"""

import sys
import pymysql

"""
pymysql 概述：
    python 的数据库接口标准是 python DB-API
    Pymysql 是从 python 连接到 mysql 数据库服务器的接口
    pymysql 的目标是成为 mysqldb 的替代品
    官方文档： http://pymysql.readthedocs.io/

安装： pip install pymysql

host : MySQL 服务器地址
user： 用户名
password : 密码
database : 数据库名称
charset : 编码方式，推荐使用 utf8mb4
"""

# 连接数据库
conn = pymysql.connect(host='10.85.48.23',
                       user='root',
                       password='123456',
                       database='sojo_eap',
                       charset='utf8mb4')

# 关闭数据库连接
conn.close()


# 封装连接mysql
def get_conn():
    conn = pymysql.connect(
        host='10.85.50.31',
        user='root',
        password='123456',
        database='sojo_eap',
        charset='utf8mb4'
    )
    return conn


"""
获取连接对象：
    打开
    关闭
获取游标对象：
    执行SQL
    查询记录
"""

"""
pymysql 数据库操作：
    CRUD操作：
        创建表
        插入记录
        查询记录
        更新记录
        删除记录
    执行事务：
        提交： commit
        回滚： rollback

数据库四大特性：
    1、原子性 ： 事务包含的所有操作要么全部成功，要么全部失败
    2、一致性 ： 事务必须使数据库从一个一致性状态变化到另一个一致性状态，也就是说一个事务执行之前和执行之后都必须处于一致性状态
        拿转账来说，假设用户A和用户B两者的钱加起来一共是5000，那么不管A和B之间如何转账，转几次账，事务结束后两个用户的钱相加起来应该还得是5000，这就是事务的一致性
    3、隔离性 ： 当多个用户并发访问数据库时，比如操作同一张表时，数据库为每一个用户开启的事务。不能被其他事务的操作所干扰。多个并发事务之间相互隔离
    4、持久性 ： 一个事务一旦提交了，那么对数据库的改变是永久性的。即使是在数据库系统遇到故障的情况下也不会丢失提交事务的操作
"""


# 封装创建表操作：创建
def create_mysql():
    # 1、获取连接对象
    conn = get_conn()
    # 2、获取游标对象
    cursor = conn.cursor()

    sql = """CREATE TABLE table(
        name VARCHAR(25),' \
        'age INT(3));"""
    # 3、执行 SQL
    cursor.execute(sql)
    # 4、关闭连接
    conn.close()


# 封装数据库操作: 查询操作
def query_mysql():
    # 1、打开连接
    conn = get_conn()
    # 2、获取游标
    cursor = conn.cursor()
    # 3、执行sql   查询语句
    sql = 'SELECT * FROM t_order_product_check_report ORDER BY create_time DESC LIMIT 6;'
    try:
        cursor.execute(sql)
        # 4、查询所有记录
        query_data = cursor.fetchall()
        # 查询单条记录
        query_data = cursor.fetchone()
        # 查询多条记录: 比如 - 5
        query_data = cursor.fetchmany(5)
        print(query_data)
    except Exception as e:
        # 打印程序运行的报错信息
        print(sys.exc_info())
    finally:
        # 关闭连接
        conn.close()


# 封装数据库操作: 插入表数据操作
def insert_mysql():
    # 1、打开连接
    conn = get_conn()
    # 2、获取游标
    cursor = conn.cursor()
    # 3、执行sql   插入数据
    sql = 'insert into table (name,age) value(MackJia,18);'
    # 比如插入等操作需要加上异常处理
    try:
        cursor.execute(sql)
        # 提交事务
        conn.commit()
        print('提交成功')
    # 如果语句执行失败，就会回滚
    except:
        # 当发生异常时，回滚到过去的状态
        conn.rollback()
        print('回滚成功')
    finally:
        # 5、关闭连接
        conn.close()
        print('关闭数据库成功')


# 更新表中的数据
def update_mysql():
    conn = get_conn()
    cursor = conn.cursor()
    sql = 'UPDATE table set age=20 where name=MackJia;'
    try:
        cursor.execute(sql)
        conn.commit()
    except:
        conn.rollback()
    finally:
        conn.close()


# 删除表中的数据
def delete_mysql():
    conn = get_conn()
    cursor = conn.cursor()
    sql = 'delete from table where name=MackJia;'
    try:
        cursor.execute(sql)
        conn.commit()
    except:
        conn.rollback()
    finally:
        conn.close()
